#include "Servidor.h"
#include "Cola.h"

Define_Module(Servidor);



Servidor::Servidor(){
	sDisponibles = 0;
}

Servidor::~Servidor(){
}


void Servidor::initialize(){
	sDisponibles = par("cs");
}



void Servidor::handleMessage(cMessage *msg){
	persona = dynamic_cast<Conductor*> (msg);
	if(persona->getAtendido()){
		persona->setSalidaServidor(simTime());
		send(persona, "salida");
		sDisponibles++;
		buscarSiguiente();
	}
	else{
    	tServicio = tiempoDeServicio();
		sDisponibles--;
		persona->setLlegadaServidor(simTime());
		persona->setAtendido(true);
		scheduleAt(simTime() + tServicio,persona);
	}
}

/*
 * Utilizado por Cola para saber cuantos servidores
 * disponibles existen
 */
int Servidor::sDisp(){
	Enter_Method_Silent("sDisp()");
	return sDisponibles;
}


/*
 * LLama a un proximo conductor que se encuentra en cola
 */
void Servidor::buscarSiguiente(){
	cGate *cg = this->gate(findGate("entrada"))->getPreviousGate();
	cModule *cm = cg->getOwnerModule();
	Cola *c = dynamic_cast<Cola *> (cm);
    c->siguienteTurno();
}


/*
 *Recupera el tiempo de servicio desde el omnetpp.ini
 */
simtime_t Servidor::tiempoDeServicio(){
	simtime_t t = par("tiempoServicio");
    if(t < 0)
		t *= -1;
	return t;
}
